package com.cxj.cxj_test_cloud.common.di.module;

import android.app.Application;
import android.content.Context;
import android.content.SharedPreferences;
import android.provider.SyncStateContract;

import org.apache.http.conn.ssl.SSLSocketFactory;

import java.util.concurrent.TimeUnit;

import javax.inject.Singleton;

import dagger.Module;
import dagger.Provides;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;

/**
 * 提供全局的单例对象
 */
@Singleton
@Module(includes = ViewModelModule.class)
public class AppModule {
    private static final int READ_TIMEOUT = 30;
    private static final int CONNECT_TIMEOUT = 30;
    private static final int WRITE_TIMEOUT = 30;
    private static final String BASEURL = RequestUrl.API_HOST;
    /**
     * 上下文对象
     * @param application
     * @return
     */
    @Singleton
    @Provides
    Context provideContext(Application application){
        return application;
    }

    /**
     * 提供全局统一的OkHttpClient客户端
     * @return
     */
    @Singleton
    @Provides
    OkHttpClient provideOkHttpClient(){
        return new OkHttpClient.Builder()
                .readTimeout(READ_TIMEOUT, TimeUnit.SECONDS)
                .writeTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS)
                .connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS)
                .retryOnConnectionFailure(true)//自动重连
                .eventListenerFactory(HttpEventListener.FACTORY)//设置耗时统计  todo 该类是怎么设置的耗时统计(让Retrofit有网络监控的能力）
                .addInterceptor(new HttpLoggingInterceptor())//打印请求日志  todo 里面封装了什么
                .hostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER)//设置信任所有证书  todo 解决测试环境出现的问题
                .build();
    }

    /**
     * 提供全局统一的SharePreferences
     * @param application
     * @return
     */
    @Singleton
    @Provides
    SharedPreferences provideSp(Application application){
        return application.getSharedPreferences(Constant.Sp.SP_USER_FILE_NAME, Context.MODE_PRIVATE);
    }

    /**
     * 提供retrofit实例  todo 只负责“把 HTTP 引擎装配好”（OkHttp + 解析器 + RxJava 适配器）
     *
     * @param okHttpClient
     * @return
     */
    @Singleton
    @Provides
    Retrofit provideRetrofit(OkHttpClient okHttpClient){
        Retrofit retrofit = new Retrofit
                .Builder()
                .baseUrl(BASEURL)
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())//todo 为什么要设置这个，为什么要使用Rxjava来做
                .addConverterFactory(ResponseConverterFactory.create())//支持Gson   todo 使用自定义的转换器,方便解决泛型解析问题(Retrofit内部使用的是Gson)
                .client(okHttpClient)//支持okHttp
                .build();
        return retrofit;
    }

    /**
     * 提供retrofit服务器操作实例  todo 只负责“用装配好的引擎生成接口代理”，让业务层直接拿到 ServerApi 去调方法。
     *
     * @param retrofit
     * @return
     */
    @Singleton
    @Provides
    Retrofit provideServiceApi(Retrofit retrofit){
        return retrofit.create(ServerApi.class);
    }
}
